package com.zhang.spark_1.spark_core.operator.transform

import org.apache.spark.rdd.RDD
import org.apache.spark.{SparkConf, SparkContext}

/**
 * @title:
 * @author: zhang
 * @date: 2021/12/5 18:51 
 */
object Spark18_RDD_Operator_Transform {

  def main(args: Array[String]): Unit = {
    //获取spark的连接
    val conf: SparkConf = new SparkConf().setMaster("local[*]").setAppName("operator")
    val sc: SparkContext = new SparkContext(conf)
    //TODO combineByKey
    val rdd: RDD[(String, Int)] = sc.makeRDD(List(
      ("a", 88), ("b", 95), ("a", 91),
      ("b", 93), ("a", 95), ("b", 98)),
      2)
    /*
    combineByKey:方法需要三个参数
    第一个参数表示：将相同key的第一个数据进行结构转化，实现操作
    第二个参数表示：分区内计算规则
    第三个参数表示：分区间计算规则
     */


    val newRDD: RDD[(String, (Int, Int))] = rdd.combineByKey(
      (_,1),
      //因为这里的结构是运行时才知道的，所以应该明确参数类型
      (t:(Int,Int), v) => (t._1 + v, t._2 + 1),
      (t1:(Int,Int), t2:(Int,Int)) => (t1._1 + t2._1, t1._2 + t2._2)
    )
    newRDD.mapValues(t=>t._1/t._2).collect().foreach(println)
 

    sc.stop()

  }
}
